home *** CD-ROM | disk | FTP | other *** search
Text File | 1998-04-30 | 27.5 KB | 1,232 lines | [TEXT/MPS ] |
- /*
- File: DDPSample.cp
-
- Contains: Sample program for demonstration of DDP Endpoints, NBP (via TMapper),
- and ZIP (via TAppleTalkServices).
-
- Copyright: © 1991-1996 by Apple Computer, Inc., all rights reserved.
-
- */
-
- #ifndef __OPENTPTGLOBALNEW__
- #include <OpenTptGlobalNew.h>
- #endif
- #ifndef __OPENTPTAPPLETALK__
- #include <OpenTptAppleTalk.h>
- #endif
- #ifndef __ATALKSAMPLEUTILS__
- #include "ATalkSampleUtils.h"
- #endif
- #ifndef __STDIO__
- #include <stdio.h>
- #endif
- #ifndef __EVENTS__
- #include <Events.h>
- #endif
-
- OSStatus gErrorAckMsg = kOTNoError;
- void* gOKAckMsg = NULL;
- size_t gLkUpReplies;
- size_t gOurAddrLen;
- UInt8 gOurAddr[50];
- long gNotifyFlag;
- OTEventCode gNotifyCode;
- OSStatus gNotifyErr;
- void* gNotifyCookie;
- RgnHandle gRgn;
-
- const size_t kMaxReplyBufLen = (578 * 8) + 4;
-
- static UInt8 incomingReply[kMaxReplyBufLen];
-
-
- /*******************************************************************************
- ** HandleEndpointEvents
- ********************************************************************************/
-
- pascal void HandleEndpointEvents(void* contextPtr, OTEventCode code,
- OTResult result, void* it)
- {
- if ( contextPtr != &gNotifyFlag )
- DebugStr("\pHandleEndpointEvents: The contextPtr is not correct");
- else
- *((unsigned long*)contextPtr) = (code << 16) + result;
-
- if ( code == T_MEMORYRELEASED )
- {
- gOKAckMsg = it;
- }
- else
- {
- gNotifyCode = code;
- gNotifyErr = (OSStatus)result;
- gNotifyCookie = it;
- }
- }
-
- /*******************************************************************************
- ** HandleMapperEvents TMapper (NBP) Event Handling
- ********************************************************************************/
-
- pascal void HandleMapperEvents(void*, OTEventCode event, OTResult result,
- void* cookie)
- {
- switch ( event )
- {
- case T_LKUPNAMERESULT: // intermediate result notification
- break;
-
- case T_LKUPNAMECOMPLETE:
-
- if ( result != kOTNoError )
- gErrorAckMsg = (OSStatus)result;
- gOKAckMsg = cookie;
- break;
-
- case T_REGNAMECOMPLETE:
- if ( result != kOTNoError )
- {
- gErrorAckMsg = (OSStatus)result;
- }
- else
- {
- gOKAckMsg = (void*) 1;
- }
- break;
-
- case T_DELNAMECOMPLETE:
- if ( result != kOTNoError )
- {
- gErrorAckMsg = (OSStatus)result;
- }
- else
- {
- gOKAckMsg = (void*) 1;
- }
- break;
-
- default:
- DebugStr("\pHandleMapperEvents: Unexpected Event!;g");
- break;
- }
- }
-
- /*******************************************************************************
- ** HandleServicesEvents AppleTalkSvc (ZIP) Event Handling
- ********************************************************************************/
-
- pascal void HandleServicesEvents(void*, OTEventCode event, OTResult result,
- void* cookie)
- {
- switch ( event )
- {
- case T_GETMYZONECOMPLETE:
- if ( result != kOTNoError )
- {
- gErrorAckMsg = (OSStatus)result;
- break;
- }
- gOKAckMsg = cookie;
- break;
-
- case T_GETLOCALZONESCOMPLETE:
- if ( result != kOTNoError )
- {
- gErrorAckMsg = (OSStatus)result;
- break;
- }
- gOKAckMsg = cookie;
- break;
-
- case T_GETZONELISTCOMPLETE:
- if ( result != kOTNoError )
- {
- gErrorAckMsg = (OSStatus)result;
- break;
- }
- gOKAckMsg = cookie;
- break;
-
- case T_GETATALKINFOCOMPLETE:
- if ( result != kOTNoError )
- {
- gErrorAckMsg = (OSStatus)result;
- break;
- }
- gOKAckMsg = cookie;
- break;
-
- default:
- DebugStr("\pHandleServicesEvents: Unexpected Event!;g");
- break;
- }
- }
-
- /* -------------------------------------------------------------------------
- DDP Demonstration routines
- ------------------------------------------------------------------------- */
-
- /*******************************************************************************
- ** BindDDPEndpoint
- ********************************************************************************/
-
- OSStatus BindDDPEndpoint(EndpointRef ep)
- {
- OSStatus err;
-
- //
- // Request socket $54 and DDP $4
- //
- DDPAddress reqAddr;
- reqAddr.Init(0, 0, 0x54, 4); // Source address & type
-
- TBind req;
-
- req.addr.buf = (UInt8*)&reqAddr;
- req.addr.len = kDDPAddressLength;
- req.qlen = 0;
-
- DDPAddress retAddr;
- TBind ret;
-
- ret.addr.buf = (UInt8*)&retAddr;
- ret.addr.maxlen = sizeof(retAddr);
-
- fprintf(stderr, "Binding DDP endpoint\n");
- err = OTBind(ep, &req, &ret);
- if ( err != kOTNoError )
- {
- fprintf(stderr, "Bind returns %d\n", err);
- return err;
- }
- ShowDDPAddress(&retAddr);
-
- fprintf(stderr, "\nAfter Bind, ");
- ShowEndpointState(ep, "");
-
- return err;
- }
-
- /*******************************************************************************
- ** ReadData
- ********************************************************************************/
-
- OSStatus ReadData(EndpointRef ep)
- {
- OTFlags flags = 0;
- DDPAddress theDest;
- UInt8 buf[200];
- TUnitData theData;
-
- theData.udata.buf = buf;
- theData.udata.maxlen= sizeof(buf);
- theData.addr.buf = (UInt8*)&theDest;
- theData.addr.maxlen = sizeof(theDest);
- theData.opt.maxlen = 0;
-
- OSStatus err = OTRcvUData(ep, &theData, &flags);
-
- if ( err != kOTNoError )
- {
- fprintf(stderr, "RcvUData() returns %d", err);
- if (err == kOTNoDataErr)
- fprintf(stderr, " (kOTNoDataErr)\n");
- else
- fprintf(stderr, "\n");
- }
-
- if ( err != kOTNoError )
- return err;
-
- size_t numbytes = theData.udata.len;
- fprintf(stderr, "flags = %08lx; read %d bytes: ", flags, numbytes);
- if ( numbytes > 10 )
- numbytes = 10;
-
- for (size_t i = 0 ; i < numbytes ; i++)
- fprintf(stderr, "%02x ", buf[i]);
- fprintf(stderr, "\n");
-
- return err;
- }
-
- /*******************************************************************************
- ** DoSend
- ********************************************************************************/
-
- OSStatus DoSend(EndpointRef ep)
- {
- DDPAddress theDest; // Who to send to
- TUnitData unitData; // To pass to SndUData
- OSStatus err;
-
- static unsigned char theBuffer[] = "\x01Hello"; // What to send them
-
- theDest.Init(0, 0xff, 4, 4);
-
- unitData.udata.buf = theBuffer;
- unitData.udata.len = 6; // Initialize data
- unitData.addr.buf = (UInt8*)&theDest;
- unitData.addr.len = kDDPAddressLength; // Initialize address part
- unitData.opt.len = 0; // No options
-
- OTAckSends(ep);
- gOKAckMsg = NULL;
- gNotifyCode = 0;
-
- err = OTSndUData(ep, &unitData);
-
- OTDontAckSends(ep);
- if ( err != kOTNoError )
- {
- fprintf(stderr, "SndUData() returns %d\n", err);
- }
- else
- {
- //
- // It's very important that we read the data while we are waiting for the "ack send" to complete.
- // DDP can use our own message to reply to us, and if we don't "read" the message, the "ackSend"
- // will never complete.
- //
- while ( gOKAckMsg == NULL )
- {
- if ( gNotifyCode == T_DATA )
- {
- gNotifyCode = 0;
- while ( ReadData(ep) != kOTNoDataErr )
- OTIdle();
- }
- OTIdle();
- }
- if ( gOKAckMsg != theBuffer )
- {
- fprintf(stderr, "ERROR: DoSend - the T_SENDCOMPLETE cookie was not my buffer (%08X)\n", gNotifyCookie);
- }
- }
- return err;
- }
-
- /* -------------------------------------------------------------------------
- NBP Demonstration routines
- ------------------------------------------------------------------------- */
-
- /*******************************************************************************
- ** DoSendLkUpReq
- ********************************************************************************/
-
- OSStatus DoSendLkUpReq(size_t count, MapperRef epm)
- {
- OSStatus err = kOTNoError;
-
- static char stuff[] = "=:Workstation"; // pattern we want to look up
-
- TLookupRequest theRequest;
-
- theRequest.name.buf = (UInt8*)stuff;
- theRequest.name.len = OTStrLength(stuff);
- theRequest.addr.len = 0;
- theRequest.maxcnt = count;
- theRequest.timeout = 0; // Default timeout
-
- gErrorAckMsg = kOTNoError;
- gOKAckMsg = NULL;
-
- fprintf(stderr, "Looking for %d names that match \"%s\"\n", count, stuff);
-
- do
- {
- TLookupReply* theReply = new TLookupReply;
- if ( theReply == NULL )
- {
- err = kENOMEMErr;
- break;
- }
- theReply->names.buf = incomingReply;
- theReply->names.maxlen = kMaxReplyBufLen;
-
- err = OTLookupName(epm, &theRequest, theReply);
-
- if ( err != kOTNoError )
- {
- fprintf(stderr, "DoSendLkUpReq:LookupName returns %d\n", err);
- }
- else
- {
- err = kOTNoError;
- }
-
- } while ( false );
- return err;
- }
-
- /*******************************************************************************
- ** DoReadLkUpReplies
- ********************************************************************************/
-
- void DoReadLkUpReplies()
- {
- long datacnt = 0;
- TLookupReply* reply;
- UInt8* ptr;
-
- while ( gOKAckMsg == NULL && gErrorAckMsg == kOTNoError )
- OTIdle();
-
- reply = (TLookupReply*)gOKAckMsg;
-
- if ( gErrorAckMsg != kOTNoError )
- {
- fprintf(stderr, "Lookup completed with error %d\n", gErrorAckMsg);
- }
-
- if ( gErrorAckMsg == kOTNoError || gErrorAckMsg == kOTBufferOverflowErr )
- {
- ptr = reply->names.buf;
-
- long linct = reply->rspcount;
-
- while ( linct-- )
- {
- UInt16 addrLength = ((short*)ptr)[0];
- UInt16 nameLength = ((short*)ptr)[1];
-
- ptr += 2*sizeof(short);
-
- if ( addrLength != kDDPAddressLength || ((DDPAddress*)ptr)->GetAddressType() != AF_ATALK_DDP)
- {
- fprintf(stderr, "Unexpected Address");
- }
- else
- {
- ShowDDPAddress((DDPAddress*)ptr); // show the address
- }
- ptr += addrLength;
- fprintf(stderr, " = ");
-
- fprintf(stderr, "%*.*s", nameLength, nameLength, ptr);
-
- fprintf(stderr, "\n");
-
- ptr += nameLength;
- if ( (addrLength + nameLength) & 3 ) // pad to 4 byte alignment
- {
- ptr += (4 - ((addrLength + nameLength) & 3));
- }
- }
- fprintf(stderr, "Reply %2d: %3d bytes %3d names ", ++datacnt,
- reply->names.len, reply->rspcount);
- fprintf(stderr, "\n");
-
- delete reply;
- }
- }
-
- /*******************************************************************************
- ** DoRegisterName
- ********************************************************************************/
-
- OSStatus DoRegisterName(MapperRef epm)
- {
- OSStatus err = kOTNoError;
-
- static char stuff[] = "NBPFreddy:WorkStation@*";
-
- TRegisterRequest theRequest;
- //
- // We don't want to register the name on any particular address,
- // so let AppleTalk pick one for us.
- //
- theRequest.name.buf = (UInt8*)stuff;
- theRequest.name.len = OTStrLength(stuff);
- theRequest.addr.len = 0;
-
- fprintf(stderr, "Registering NBPFreddy:WorkStation@*\n");
- gErrorAckMsg = kOTNoError;
- gOKAckMsg = NULL;
-
- do
- {
- err = OTRegisterName(epm, &theRequest, NULL);
-
- if ( err != kOTNoError && err != kOTNoDataErr )
- break;
-
- err = kOTNoError;
-
- while ( gOKAckMsg == NULL && gErrorAckMsg == kOTNoError && !Button() )
- OTIdle();
-
- if ( gErrorAckMsg != kOTNoError )
- {
- err = gErrorAckMsg;
- }
-
- gErrorAckMsg = kOTNoError;
- gOKAckMsg = NULL;
-
- } while ( false );
-
- return err;
- }
-
- /*******************************************************************************
- ** DoDeleteName
- ********************************************************************************/
-
- OSStatus DoDeleteName(MapperRef epm)
- {
- OSStatus err = kOTNoError;
-
- static char stuff[] = "NBPFreddy:WorkStation@*";
-
- TNetbuf theRequest;
-
- theRequest.buf = (UInt8*)stuff;
- theRequest.len = OTStrLength(stuff);
-
- fprintf(stderr, "Deleting NBPFreddy:WorkStation@*\n");
- gErrorAckMsg = kOTNoError;
- gOKAckMsg = NULL;
-
- do
- {
- err = OTDeleteName(epm, &theRequest);
-
- if ( err != kOTNoError && err != kOTNoDataErr )
- break;
-
- err = kOTNoError;
-
- while ( gOKAckMsg == NULL && gErrorAckMsg == kOTNoError && !Button() )
- OTIdle();
-
- if ( gErrorAckMsg != kOTNoError )
- {
- err = gErrorAckMsg;
- }
-
- gErrorAckMsg = kOTNoError;
- gOKAckMsg = NULL;
-
- } while ( false );
-
- return err;
- }
-
- /*******************************************************************************
- ** DoConfirmName
- ********************************************************************************/
-
- OSStatus DoConfirmName(MapperRef epm)
- {
- OSStatus err = kOTNoError;
-
- //
- // name we want to confirm
- //
- static char stuff[] = "Magic Kingdom:WorkStation@*";
-
- TLookupRequest theRequest;
-
- theRequest.name.buf = (UInt8*)stuff;
- theRequest.name.len = OTStrLength(stuff);
- theRequest.maxcnt = 1;
- theRequest.timeout = 0; // Default timeout
-
- //
- // Where we think it is
- //
- DDPAddress theAddr;
- theAddr.Init(35203,180, 4, 0); // Of course this is valid only on our network.
-
- theRequest.addr.buf = (UInt8*)&theAddr;
- theRequest.addr.len = kDDPAddressLength;
-
- TLookupReply theReply;
- char buf[kDDPAddressLength + sizeof(TLookupBuffer) + kNBPEntityBufferSize];
-
- theReply.names.buf = (UInt8*)buf;
- theReply.names.maxlen = sizeof(buf);
-
- fprintf(stderr, "Confirming Magic Kingdom:WorkStation@* = 35203, 180, 4, 0\n");
- gErrorAckMsg = kOTNoError;
- gOKAckMsg = NULL;
-
- do
- {
- err = OTLookupName(epm, &theRequest, &theReply);
-
- if ( err != kOTNoError )
- break;
-
- while ( gOKAckMsg == NULL && gErrorAckMsg == kOTNoError && !Button() )
- OTIdle();
-
- if ( gErrorAckMsg != kOTNoError && gErrorAckMsg != kOTBufferOverflowErr )
- {
- err = gErrorAckMsg;
- }
- else
- {
- if ( theReply.rspcount != 1 )
- {
- fprintf(stderr, "ERROR: LookupName completed successfully, but rspcount is %d\n",
- theReply.rspcount);
- }
- else
- {
- TLookupBuffer* buf = (TLookupBuffer*)theReply.names.buf;
- if ( buf->fAddressLength != kDDPAddressLength )
- {
- fprintf(stderr, "ERROR: Got back %d for the address length, instead of %d\n",
- buf->fAddressLength, kDDPAddressLength);
- }
- else
- {
- DDPAddress* addr = (DDPAddress*)buf->fAddressBuffer;
- fprintf(stderr, "Confirmed address of %u, %u, %u for \"%s\"\n",
- addr->GetNetwork(), addr->GetNode(), addr->GetSocket(), stuff);
- }
- }
- }
-
- gErrorAckMsg = kOTNoError;
- gOKAckMsg = NULL;
-
- } while ( false );
-
- return err;
- }
-
- /* -------------------------------------------------------------------------
- ZIP Demonstration routines
- ------------------------------------------------------------------------- */
-
- /*******************************************************************************
- ** DoGetLocalZones
- ********************************************************************************/
-
- OSStatus DoGetLocalZones(TAppleTalkServices* svc)
- {
- OSStatus err = kOTNoError;
-
- do
- {
- TNetbuf* theReply = new TNetbuf;
- if ( theReply == NULL )
- {
- fprintf(stderr, "DoGetLocalZones: cannot allocate reply TNetbuf\n");
- break;
- }
- theReply->buf = incomingReply;
- theReply->maxlen= kMaxReplyBufLen;
-
- fprintf(stderr, "Requesting a LocalZoneList\n");
- gErrorAckMsg = kOTNoError;
- gOKAckMsg = NULL;
-
- err = svc->GetLocalZones(theReply);
-
- if ( err != kOTNoError && err != kOTNoDataErr )
- {
- fprintf(stderr, "DoGetLocalZones: OTGetLocalZones() returns %d\n", err);
- }
- else
- {
- err = kOTNoError;
-
- while ( gOKAckMsg == NULL && gErrorAckMsg == kOTNoError && !Button() )
- OTIdle();
-
- if ( gErrorAckMsg != kOTNoError )
- {
- return gErrorAckMsg;
- }
- else if ( gOKAckMsg != NULL )
- {
- TNetbuf* zoneList = (TNetbuf*) gOKAckMsg;
- UInt8* ptr = zoneList->buf;
- UInt8* max = ptr + zoneList->len;
- fprintf(stderr, "LocalZoneNames returned\n");
-
- while ( ptr < max )
- {
- int cnt = *ptr++;
- while ( cnt-- != 0 )
- fprintf(stderr, "%1c", *ptr++);
- fprintf(stderr, "\n");
- }
-
- delete zoneList;
- gOKAckMsg = NULL;
- fprintf(stderr,"LocalZoneList Complete!\n");
- return kOTNoError;
- }
- }
-
- } while ( false );
-
- return err;
- }
-
- /*******************************************************************************
- ** DoGetZoneList
- ********************************************************************************/
-
- OSStatus DoGetZoneList(TAppleTalkServices* svc)
- {
- OSStatus err = kOTNoError;
-
- do
- {
- TNetbuf* theReply = new TNetbuf;
- if ( theReply == NULL )
- {
- fprintf(stderr, "DoGetZoneList: cannot allocate reply TNetbuf\n");
- break;
- }
- theReply->buf = incomingReply;
- theReply->maxlen= kMaxReplyBufLen;
-
- fprintf(stderr, "Requesting a complete network ZoneList\n");
- gErrorAckMsg = kOTNoError;
- gOKAckMsg = NULL;
-
- err = svc->GetZoneList(theReply);
-
- if ( err != kOTNoError && err != kOTNoDataErr )
- {
- fprintf(stderr, "DoGetZoneList: OTGetZoneList() returns %d\n", err);
- }
- else
- {
- err = kOTNoError;
-
- while ( gOKAckMsg == NULL && gErrorAckMsg == kOTNoError && !Button() )
- OTIdle();
-
- if ( gErrorAckMsg != kOTNoError )
- {
- return gErrorAckMsg;
- }
- else if ( gOKAckMsg != NULL )
- {
- TNetbuf* zoneList = (TNetbuf*) gOKAckMsg;
- UInt8* ptr = zoneList->buf;
- UInt8* max = ptr + zoneList->len;
-
- fprintf(stderr, "ZoneListNames returned \n");
-
- while ( ptr < max )
- {
- int cnt = *ptr++;
- while ( cnt-- != 0 )
- fprintf(stderr, "%1c", *ptr++);
- fprintf(stderr, "\n");
- }
-
- delete zoneList;
- gOKAckMsg = NULL;
- fprintf(stderr,"ZoneList Complete!\n");
- return kOTNoError;
- }
- }
-
- } while ( false );
-
- return err;
- }
-
- /*******************************************************************************
- ** DoGetNetInfo
- ********************************************************************************/
-
- OSStatus DoGetNetInfo(TAppleTalkServices* svc)
- {
- OSStatus err = kOTNoError;
-
- do
- {
- TNetbuf* theReply = new TNetbuf;
- if ( theReply == NULL )
- {
- fprintf(stderr, "DoGetNetInfo: cannot allocate reply TNetbuf\n");
- break;
- }
- theReply->buf = incomingReply;
- theReply->maxlen= kMaxReplyBufLen;
-
- fprintf(stderr, "Requesting ATalk Info\n");
- gErrorAckMsg = kOTNoError;
- gOKAckMsg = NULL;
-
- err = svc->GetInfo(theReply);
-
- if ( err != kOTNoError && err != kOTNoDataErr )
- {
- fprintf(stderr, "DoGetNetInfo: OTGetATalkInfo() returns %d\n", err);
- }
- else
- {
- err = kOTNoError;
-
- while ( gOKAckMsg == NULL && gErrorAckMsg == kOTNoError && !Button() )
- OTIdle();
-
- if ( gErrorAckMsg != kOTNoError )
- {
- return gErrorAckMsg;
- }
- else if ( gOKAckMsg != NULL )
- {
- TNetbuf* reply = (TNetbuf*) gOKAckMsg;
- AppleTalkInfo* info = (AppleTalkInfo*) reply->buf;
-
-
- fprintf(stderr, "Our Address= ");
- ShowDDPAddress(&(info->fOurAddress));
- fprintf(stderr, "\n");
-
- if ( info->fFlags & kATalkInfoHasRouter )
- {
- fprintf(stderr, "Local Router Address= ");
- ShowDDPAddress(&(info->fRouterAddress));
- fprintf(stderr, "\n");
- }
-
- fprintf(stderr, "Cable Range, LOW = $%04X, HIGH = $%04X\n",
- info->fCableRange[0], info->fCableRange[1]);
-
- fprintf(stderr, "Flags returned= ");
- if ( info->fFlags & kATalkInfoIsExtended )
- {
- fprintf(stderr, "IsExtended ");
- }
- if ( info->fFlags & kATalkInfoHasRouter )
- {
- fprintf(stderr, "HasRouter ");
- }
- fprintf(stderr, "\n");
-
- delete reply;
- gOKAckMsg = NULL;
- fprintf(stderr,"NetInfo Request Complete!\n");
- return kOTNoError;
- }
- }
-
- } while ( false );
-
- return err;
-
- }
-
- /*******************************************************************************
- ** DoGetMyZoneReq
- ********************************************************************************/
-
- OSStatus DoGetMyZoneReq(TAppleTalkServices* svc)
- {
- OSStatus err = kOTNoError;
-
- do
- {
- TNetbuf* theReply = new TNetbuf;
- if ( theReply == NULL )
- {
- break;
- }
- theReply->buf = incomingReply;
- theReply->maxlen= kMaxReplyBufLen;
-
- fprintf(stderr, "Requesting current zone name\n");
- gErrorAckMsg = kOTNoError;
- gOKAckMsg = NULL;
-
- err = svc->GetMyZone(theReply);
-
- if ( err != kOTNoError && err != kOTNoDataErr )
- {
- fprintf(stderr, "DoGetMyZoneReq: OTGetMyZone() returns %d\n", err);
- }
- else
- {
- err = kOTNoError;
-
- while ( gOKAckMsg == NULL && gErrorAckMsg == kOTNoError && !Button() )
- OTIdle();
-
- if ( gErrorAckMsg != kOTNoError )
- {
- return gErrorAckMsg;
- }
- else if ( gOKAckMsg != NULL )
- {
- TNetbuf* myZone = (TNetbuf*)gOKAckMsg;
- int cnt = myZone->len;
- unsigned char* ptr = myZone->buf;
- fprintf(stderr, "MyZoneName returned= ");
- while ( cnt-- != 0 )
- fprintf(stderr, "%1c", *(ptr++));
- fprintf(stderr, "\n");
-
- delete myZone;
- gOKAckMsg = NULL;
- fprintf(stderr,"MyZoneName Complete!\n");
- return kOTNoError;
- }
- }
-
- } while ( false );
-
- return err;
- }
-
-
- /*******************************************************************************
- **
- ********************************************************************************/
-
- /* -------------------------------------------------------------------------
- Main Program
- ------------------------------------------------------------------------- */
-
- /*******************************************************************************
- ** DoTest
- ********************************************************************************/
-
- void DoTest()
- {
- OSStatus err = kOTNoError;
- EndpointRef ep = kOTInvalidEndpointRef;
-
- do
- {
- //
- // Now create a DDP
- //
- ep = OTOpenEndpoint(OTCreateConfiguration(kDDPName), 0, NULL, &err);
-
- if ( ep == kOTInvalidEndpointRef || err != kOTNoError )
- {
- ep = kOTInvalidEndpointRef;
- fprintf(stderr,"ERROR: OpenEndpoint(\"DDP\") failed with %d\n", err);
- break;
- }
- //
- // Install notifier we're going to use for testing
- //
- OTInstallNotifier(ep, HandleEndpointEvents, &gNotifyFlag);
- OTSetSynchronous(ep);
-
- ShowFullEndpointData(ep);
-
- //
- // Try to bind
- //
- OTSetSynchronous(ep);
- fprintf(stderr, "About to Bind()\n");
- err = BindDDPEndpoint(ep);
- if ( err != kOTNoError )
- break;
-
- //
- // Send out and echo request
- //
- OTSetAsynchronous(ep);
- fprintf(stderr, "About to Send some data\n");
- err = DoSend(ep);
- if ( err != kOTNoError )
- break;
-
- //
- // Wait a bit (1/4 second)
- //
- {
- OTTimeStamp stamp;
- OTGetTimeStamp(&stamp);
- while ( OTElapsedMilliseconds(&stamp) < 250 )
- OTIdle();
- }
-
- //
- // Make sure we're non-blocking so the reads will not wait for data to
- // come in.
- //
- OTSetNonBlocking(ep);
- OTSetSynchronous(ep);
-
- while ( (err = ReadData(ep)) == kOTNoError )
- {
- if (Button())
- break;
- }
-
- OTIdle();
-
- OTSetBlocking(ep);
-
- //
- // Try to Unbind
- //
- fprintf(stderr, "About to Unbind()\n");
- err = OTUnbind(ep);
- if ( err != kOTNoError )
- {
- fprintf(stderr, "ERROR: Unbind() returned %d\n", err);
- break;
- }
-
- } while ( false );
-
- //
- // Get rid of endpoint.
- //
- if ( ep != NULL )
- {
- OTRemoveNotifier(ep);
- OTCloseProvider(ep);
- }
-
- /* -------------------------------------------------------------------------
- Now Demonstrate a TMapper (NBP stuff)
- ------------------------------------------------------------------------- */
-
- MapperRef mapper = kOTInvalidMapperRef;
-
- do
- {
- //
- // Now create a NBP-based TMapper
- //
- mapper = OTOpenMapper(OTCreateConfiguration(kNBPName), 0, &err);
-
- if ( mapper == kOTInvalidMapperRef || err != kOTNoError )
- {
- mapper = kOTInvalidMapperRef;
- fprintf(stderr,"ERROR: new of NBP mapper failed.\n");
- break;
- }
- //
- // Install notifier we're going to use for testing
- //
- err = OTInstallNotifier(mapper, HandleMapperEvents, NULL);
- if ( err != kOTNoError )
- {
- fprintf(stderr, "ERROR: InstallNotifier() failed with %d\n", err);
- break;
- }
- OTSetAsynchronous(mapper);
-
- do
- {
-
- /* -------------------------------------------------------------------------
- Register an NBP Name...currently "NBPFreddy:WorkStation@*"
- ------------------------------------------------------------------------- */
-
- err = DoRegisterName(mapper);
- if ( err != kOTNoError )
- {
- fprintf(stderr, "DoRegisterName returned %d\n", err);
- break;
- }
-
- fprintf(stderr, "Name Registration complete…click mouse to exit!\n");
-
- while ( !Button() ) // Wait for 'um to press mouse button
- ;
- while ( Button() ) // Wait for 'um to remove their grubby paws!
- ;
-
- /* -------------------------------------------------------------------------
- Perform an NBP lookup...requesting 10 replies (unless you change it)
- ------------------------------------------------------------------------- */
-
- gLkUpReplies = 10;
-
- //
- // Send Lookup request
- //
- DoSendLkUpReq(gLkUpReplies, mapper);
-
- //
- // Show the replies
- //
- DoReadLkUpReplies();
-
- /* -------------------------------------------------------------------------
- Delete our registered NBP Name
- ------------------------------------------------------------------------- */
-
- err = DoDeleteName(mapper);
- if ( err != kOTNoError )
- {
- fprintf(stderr, "DoDeleteName returned %d\n", err);
- break;
- }
-
-
- /* -------------------------------------------------------------------------
- Confirm an NBP Name to address mapping
- ------------------------------------------------------------------------- */
-
- err = DoConfirmName(mapper);
- if ( err != kOTNoError )
- {
- fprintf(stderr, "DoConfirmName returned %d\n", err);
- break;
- }
-
- fprintf(stderr, "Name Confirmation complete…click mouse to exit!\n");
-
- while ( !Button() ) // Wait for 'um to press mouse button
- ;
- while ( Button() ) // Wait for 'um to remove their grubby paws!
- ;
-
- } while ( false );
-
- } while ( false );
-
- //
- // Get rid of TMapper.
- //
- if ( mapper != NULL )
- {
- OTRemoveNotifier(mapper);
- OTCloseProvider(mapper);
- }
-
- /* -------------------------------------------------------------------------
- Now Demonstrate a AppleTalkSvc (Zones, etc.)
- ------------------------------------------------------------------------- */
-
- TAppleTalkServices* svc = NULL;
-
- do
- {
- //
- // Now create a ZIP
- //
- svc = OTOpenAppleTalkServices(kDefaultAppleTalkServicesPath, 0, &err);
-
- if ( svc == NULL || err != kOTNoError )
- {
- svc = NULL;
- fprintf(stderr,"ERROR: open of ZIP ATalkSvc failed.\n");
- }
-
- //
- // Install notifier we're going to use
- //
- err = svc->InstallNotifier(HandleServicesEvents, NULL);
- if ( err != kOTNoError )
- {
- fprintf(stderr, "ERROR: InstallNotifier() failed with %d\n", err);
- break;
- }
- svc->SetAsynchronous();
-
- /* -------------------------------------------------------------------------
- Perform a ZIP GetZoneList.
- ------------------------------------------------------------------------- */
-
- do
- {
- //
- // Send data
- //
- err = DoGetZoneList(svc);
- if ( err != kOTNoError )
- {
- fprintf(stderr, "DoGetZoneList returned %d\n", err);
- break;
- }
-
- } while ( false );
-
- /* -------------------------------------------------------------------------
- Issue a ZIP GetMyZoneName.
- ------------------------------------------------------------------------- */
-
- err = DoGetMyZoneReq(svc);
- if ( err != kOTNoError )
- {
- fprintf(stderr, "DoGetMyZoneReq returned %d\n", err);
- break;
- }
-
- /* -------------------------------------------------------------------------
- Issue a ZIP GetNetInfo.
- ------------------------------------------------------------------------- */
-
- err = DoGetNetInfo(svc);
- if ( err != kOTNoError )
- {
- fprintf(stderr, "DoGetNetInfoReq returned %d\n", err);
- break;
- }
-
- /* -------------------------------------------------------------------------
- Perform a ZIP GetLocalZones.
- ------------------------------------------------------------------------- */
-
- do
- {
- //
- // Send data
- //
- err = DoGetLocalZones(svc);
- if ( err != kOTNoError )
- {
- fprintf(stderr, "DoGetLocalZones returned %d\n", err);
- break;
- }
-
- } while ( false );
-
- } while ( false );
-
- //
- // Get rid of AppleTalkSvc.
- //
- if ( svc != NULL )
- {
- svc->RemoveNotifier();
- svc->Close();
- }
- }
-
- /*******************************************************************************
- ** Initialize Open Transport and call DoTest function
- ********************************************************************************/
-
- main(int, char**)
- {
- InitGraf(&qd.thePort); // initialize quickdraw so we can use regions
-
- fprintf(stderr, "DDPSample showing usage of DDP, Mapper object,\n");
- fprintf(stderr, "and the AppleTalk services object.\n\n");
- //
- // Initialize Open Transport
- //
- InitOpenTransport();
-
- //
- // Run the test
- //
- DoTest();
-
- //
- // Close down Open Transport.
- // Not strictly necessary since it patches _ExitToShell and will
- // clean us up anyway.
- //
- CloseOpenTransport();
-
- fprintf(stderr, "\n\nDone\n");
-
- return 0;
- };
-